/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ipartek.formacion.gestformwww.modelo.clases;

import com.ipartek.formacion.gestformwww.modelo.beans.Correo;
import com.ipartek.formacion.gestformwww.modelo.beans.excepciones.GestorFormacionExcepcion;
import com.ipartek.formacion.gestformwww.modelo.interfaces.ICorreoDAO;
import java.sql.*;
import java.util.ArrayList;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Curso
 */
public class SQLServerCorreoDAO implements ICorreoDAO {

    private static ResourceBundle rb;

    public SQLServerCorreoDAO() {
        rb = ResourceBundle.getBundle("com.ipartek.formacion.gestformwww.controlador.excepciones");
    }

    public void guardarCorreo(ArrayList<Correo> correos) throws GestorFormacionExcepcion {
        Connection conexion = null;
        SentenciaNula stmt = null;
        SentenciaNula stmt2 = null;
        ResultSet rs = null;
        Integer id = null;
        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCorreoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }
        try {
            stmt = new SentenciaNula(conexion, "INSERT INTO CORREO (CorAsunto, CorCuerpo, CorDestina, CorFecha, CurId, CorEnviado) VALUES(?,?,?,?,?,?)", Statement.RETURN_GENERATED_KEYS);
            stmt2 = new SentenciaNula(conexion, "INSERT INTO CORREOCAN (CanId, CorId, ConId) VALUES (?,?,?)");
            for (Correo correo : correos) {
                stmt.setString(1, correo.getAsunto());
                stmt.setString(2, correo.getCuerpo());
                stmt.setString(3, correo.getDestinatario());
                stmt.setTimestamp(4, correo.getFecha());
                stmt.setInt(5, correo.getCurId());
                stmt.setBoolean(6, correo.isEnviado());
                stmt.executeUpdate();
                rs = stmt.getGeneratedKeys();
                if (rs.next()) {
                    id = rs.getInt(1);
                    correo.setCorId(id);
                    stmt2.setInt(1, correo.getCanId());
                    stmt2.setInt(2, id);
                    stmt2.setInt(3, correo.getConId());
                    stmt2.executeUpdate();
                }
            }
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCorreoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(conexion);
        }
    }
    
    public ArrayList<Correo> listarCorreoCandidatoConvocatoria(int idCan, int idCon)throws GestorFormacionExcepcion {
        Connection conexion = null;
        ArrayList<Correo> listacorreo = new ArrayList<Correo>();
        ResultSet rs = null;
        PreparedStatement stmt = null;

        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCorreoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try{
            stmt = conexion.prepareStatement("SELECT dbo.CORREO.CorId,dbo.CORREO.CorDestina,dbo.CORREO.CorEnviado,dbo.CORREO.CurId, dbo.CORREO.CorAsunto, dbo.CORREO.CorCuerpo, dbo.CORREO.CorFecha, dbo.CORREOCAN.CanId, dbo.CORREOCAN.ConId FROM dbo.CORREO INNER JOIN dbo.CORREOCAN ON dbo.CORREO.CorId = dbo.CORREOCAN.CorId WHERE dbo.CORREOCAN.ConId=? AND dbo.CORREOCAN.CanId=?");
            stmt.setInt(1, idCon);
            stmt.setInt(2, idCan);
            rs = stmt.executeQuery();

            while (rs.next()){
                listacorreo.add(instanciarCorreo(rs));
            }

        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCorreoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(conexion);
        }

        return listacorreo;
    }

    public ArrayList<Correo> listarCorreoCurso(int idCandidato, int idCurso)throws GestorFormacionExcepcion{
        Connection conexion = null;
        ArrayList<Correo> listacorreo = new ArrayList<Correo>();
        ResultSet rs = null;
        PreparedStatement stmt = null;

        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCorreoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try{
            stmt = conexion.prepareStatement("SELECT dbo.CORREO.CorId, dbo.CORREO.CorAsunto, dbo.CORREO.CorCuerpo, dbo.CORREO.CorDestina, dbo.CORREO.CurId, dbo.CORREO.CorEnviado, dbo.CORREO.CorFecha, dbo.CORREOCAN.CanId FROM dbo.CORREO INNER JOIN dbo.CORREOCAN ON dbo.CORREO.CorId = dbo.CORREOCAN.CorId WHERE dbo.CORREO.CurId=? AND dbo.CORREOCAN.CanId=?");
            stmt.setInt(1, idCurso);
            stmt.setInt(2, idCandidato);
            rs = stmt.executeQuery();
            
            while (rs.next()){
                listacorreo.add(instanciarCorreo(rs));
            }

        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCorreoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(conexion);
        }

        return listacorreo;
    }

    /**
     * Crea una instancia de un objeto correo a partir del resultset obtenido de la base de datos
     * @param ResultSet de la basa de datos
     * @return Correo.
     */
    private Correo instanciarCorreo(ResultSet rs) throws SQLException {
        Correo correo = new Correo();

        correo.setAsunto(rs.getString("CorAsunto"));
        correo.setCorId(rs.getInt("CorId"));
        correo.setCuerpo(rs.getString("CorCuerpo"));
        correo.setCurId(rs.getInt("CurId"));
        correo.setDestinatario(rs.getString("CorDestina"));
        correo.setEnviado(rs.getBoolean("CorEnviado"));
        correo.setCanId(rs.getInt("CanId"));
        correo.setFecha(rs.getTimestamp("CorFecha"));

        return correo;
    }
}
